from flask import render_template, current_app, jsonify

# 2. 导入蓝图
from info import db
from info.utils.response_code import RET
from . import news_blue
# 导入flask内置对象
from flask import session, request,g
# 导入模型类
from info.models import User, News, Category
# 导入登陆装饰其
from info.utils.commons import login_required

@news_blue.route('/')
@login_required
def index():
    # 首页
    # 实现页面右上角，检查用户的登陆状态，如果用户登陆显示用户信息，
    # 如果未登陆，提供注册入口
    # 2.从redis数据库中获取用户的id
    # 3.把用户信息，传给模板


    # 新闻点击排行
    # 根据点击的次数查询数据库，获取用户信息
    # user_id = session.get('user_id')
    # user = None
    # if user:
    #     try:
    #         user = User.query.get(user_id)
    #     except Exception as e:
    #         current_app.logger.error(e)

    #     新闻点击排行
    user = g.user
    try:
        new_list = News.query.order_by(News.clicks.desc()).limit(6)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取信息失败')
    if not new_list:
        return jsonify(errno=RET.NODATA, errmsg='无新闻排行数据')

    # # 定义一个列表
    new_click_list = []
    # 遍历数据，添加给模板
    for news in new_list:
        new_click_list.append(news.to_dict())

    # 新闻分类展示
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻分类数据失败')
    if not categories:
        return jsonify(errno=RET.NODATA, errmsg='没有新闻分类数据')
    # 定义容器
    category_list = []
    # 便利数据
    for category in categories:
        category_list.append(category.to_dict())

    # 定义字典，用来返回数据
    # user = None
    data = {
        'user_info': user.to_dict() if user else None,
        'new_click_list': new_click_list,
        'category_list': category_list
    }

    return render_template('news/index.html', data=data)


@news_blue.route('/news_list')
# @login_required
def new_list():
    # 获取参数cid，page，per_page
    cid = request.args.get('cid', '1')
    page = request.args.get('page', '1')
    per_page = request.args.get('per_page', '10')
    # 检查参数
    try:
        cid, page, per_page = int(cid), int(page), int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数类型错误')
        # 根据分类id查询数据库
    filters = []
    # 如果分类 id大雨1，添加分类id给filters过滤条件
    if cid > 1:
        filters.append(News.category_id == cid)
        # 查询数据库
    try:
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻列表数据失败')
        # 使用分页对象，获取页面后的数据，总页数，当前页数
    news_list = paginate.items
    total_page = paginate.pages
    current_page = paginate.page
    # 定义一个列表
    news_dict_list = []
    print(news_list)
    # 遍历分页数据，转成字典
    for news in news_list:
        news_dict_list.append(news.to_dict())
        # 定义容器
        data = {
            'total_page': total_page,
            'current_page': current_page,
            'news_dict_list': news_dict_list
        }

        # 返回数据
    return jsonify(errno=RET.OK, errmsg='OK', data=data)


@news_blue.route('/<int:news_id>')
@login_required
def news_detail(news_id):
    '''
    1.通过new_id来查询数据库
    2.通过模板来显示数据

    :param new_id:
    :return:
    '''
    user = g.user
    try:
        new_list = News.query.order_by(News.clicks.desc()).limit(6)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取信息失败')
    if not new_list:
        return jsonify(errno=RET.NODATA, errmsg='无新闻排行数据')

        # # 定义一个列表
    new_click_list = []
    # 遍历数据，添加给模板
    for news in new_list:
        new_click_list.append(news.to_dict())

    # 新闻分类展示
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻分类数据失败')
    if not categories:
        return jsonify(errno=RET.NODATA, errmsg='没有新闻分类数据')

    #定义标记，用来判断用户是否已经收藏
    is_collected = False
    # 判断用户是否登陆，以及用户是否收藏该新闻
    if g.user and news in user.collection_news:
        is_collected = True

    # 定义容器
    category_list = []
    # 便利数据
    for category in categories:
        category_list.append(category.to_dict())

    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(erron=RET.DBERR, errmsg='查询数据失败')
    # 判读查询结果
    if not news:
        return jsonify(erron=RET.NODATA, errmsg='无查询结果')
    # 定义一个容器，用来返回数据
    # user = None;
    data = {
        'news_detail': news.to_dict(),
        'user_info': user.to_dict() if user else None,
        'new_click_list': new_click_list,
        # 'category_list': category_list

    }
    # 传入模板

    return render_template('news/detail.html', data=data)

@news_blue.route('/news_collect',methods=['POST'])
@login_required
def user_collect():
    '''
    用户收藏和取消收藏
    1.判断用户是否登陆
    2.如果没登了，返回错误信息
    3.获取参数，news_id action[collect,cancel_collect]
    4.检查参数的完整性
    5.转换参数的类型
    6.检查action是否是【collect，cancel_collect】
    7.判断如果用户选择得到收藏，添加该新闻
    8.否则，已出用户收藏信息
    9.返回结果
    :return:
    '''
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR,ermsg='用户未登陆')
    # 获取参数
    news_id = request.json.get('news_id')
    print(111)
    action = request.json.get('action')
    #转换参数类型
    try:
        news_id = int(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg='参数类型错误')
    #检查action参数
    if action not in ['collect','cancel_collect']:
        return jsonify(error=RET.PARAMERR,errmsg='参数格式错误')
    #根据news_id查询新闻，确认新闻的存在
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询新闻数据失败')
    #判断查询结果
    if not news:
        return jsonify(errno=RET.NODATA,errmsg='无新闻数据')
    #如果用户收藏
    if action == 'collect':
        user.collection_news.append(news)
    else:
        user.collection_news.remove(news)
    #提交数据
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='保存数据失败')
    #返回结果
    return jsonify(errno=RET.OK,errmsg='OK')





# 加载logo图标
@news_blue.route('/favicon.ico')
def favicon():
    # 把图标发送给浏览器
    return current_app.send_static_file('news/favicon.ico')
